home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 6: Level 6 / 17 Bit - Level 6 (1998)(Epic Marketing)[!].iso / quartz / q1082.dms / q1082.adf / src.lzh / Fig / popup.c < prev    next >
C/C++ Source or Header  |  1991-07-18  |  7KB  |  275 lines

  1. /* 
  2.  *    FIG : Facility for Interactive Generation of figures
  3.  *
  4.  *    Copyright (c) 1985 by Supoj Sutanthavibul (supoj@sally.UTEXAS.EDU)
  5.  *    January 1985.
  6.  *    1st revision : Aug 1985.
  7.  *
  8.  *    %W%    %G%
  9. */
  10. #include "fig.h"
  11. #include "resources.h"
  12. #include "func.h"
  13. #include "font.h"
  14.  
  15. /*******************  imported global variables and procedures  **************/
  16.  
  17. extern int        figure_modified;
  18. extern char        current_file[];
  19.  
  20. extern            put_msg();
  21. extern            init_msg_receiving();
  22. extern            read_file();
  23. extern            edit_file();
  24. extern            change_directory();
  25. extern            save_current_file();
  26. extern            save_file();
  27. extern            save_and_exit();
  28. extern            write_bitmap();
  29.  
  30. /********************  local variables  ***************************/
  31.  
  32. #define MENU_IMAGESTRING 0
  33.  
  34. MENUITEM pumenu_items[] = {
  35.     {MENU_IMAGESTRING, "Undo",        (caddr_t) F_UNDO},
  36.     {MENU_IMAGESTRING, "Redisplay",        (caddr_t) F_REDISPLAY},
  37.     {MENU_IMAGESTRING, "Remove all",    (caddr_t) F_REMOVE_ALL},
  38.     {MENU_IMAGESTRING, "Edit file...",    (caddr_t) F_EDIT},
  39.     {MENU_IMAGESTRING, "Save",        (caddr_t) F_SAVE},
  40.     {MENU_IMAGESTRING, "Read file...",    (caddr_t) F_READ},
  41.     {MENU_IMAGESTRING, "Save in...",    (caddr_t) F_SAVE_IN},
  42.     {MENU_IMAGESTRING, "Status",        (caddr_t) F_STATUS},
  43. /*    {MENU_IMAGESTRING, "Change Directory",    (caddr_t) F_CHDIR},*/
  44.     /*
  45.     {MENU_IMAGESTRING, "Print Directory",    (caddr_t) F_PWDIR},
  46.     */
  47.     {MENU_IMAGESTRING, "Save & Exit...",    (caddr_t) F_SAVE_N_EXIT},
  48.     {MENU_IMAGESTRING, "Quit",        (caddr_t) F_QUIT},
  49.     {MENU_IMAGESTRING, "Save as BITMAP...",    (caddr_t) F_SAVE_BITMAP},
  50.     };
  51. #ifndef AMIGA
  52. static MENU        menu_body = {
  53.                 MENU_IMAGESTRING,
  54.                 "commands",
  55.                 sizeof(pumenu_items)/sizeof(MENUITEM),
  56.                 pumenu_items,
  57.                 (MENU *) NULL,
  58.                 (caddr_t) NULL
  59.                 };
  60. static MENU        *menu_ptr = &menu_body;
  61. #else /* AMIGA */
  62. int NUMMENUITEMS = sizeof(pumenu_items)/sizeof(MENUITEM);
  63. #endif
  64. static char quit_msg[] = "CONFIRM with LEFT button, CANCEL with RIGHT or MIDDLE button";
  65. static char edit_msg[] = "Figures are modified; please CONFIRM with LEFT button or CANCEL with RIGHT button";
  66.  
  67. #ifdef    X11
  68. static Arg    menu_args[] =
  69. {
  70.     { XtNx, (XtArgVal)0 },
  71.     { XtNy, (XtArgVal)0 },
  72.     { XtNwidth, (XtArgVal)0 },
  73.     { XtNheight, (XtArgVal)0 },
  74. };
  75.  
  76. extern void pane_select();
  77.  
  78. static XtCallbackRec    pane_callbacks[] =
  79. {
  80.     { pane_select, NULL },
  81.     { NULL, NULL },
  82. };
  83.  
  84. static Arg      pane_args[] =
  85. {
  86.         { XtNx, (XtArgVal)0 },
  87.         { XtNy, (XtArgVal)0 },
  88.         { XtNlabel, (XtArgVal)"        " },
  89.         { XtNwidth, (XtArgVal)0 },
  90.         { XtNheight, (XtArgVal)0 },
  91.         { XtNcallback, (XtArgVal)pane_callbacks },
  92. };
  93.  
  94. TOOL        menu;
  95.  
  96. int init_menu(tool)
  97.     TOOL            tool;
  98. {
  99.     TOOL            panes, pane;
  100.     register int        i, tlen, rlen = 0;
  101.     register MENUITEM    *mi;
  102.     XtTranslations        popdown_actions, pane_actions;
  103.  
  104.     menu = XtCreatePopupShell("popup_menu", overrideShellWidgetClass, tool,
  105.         menu_args, XtNumber(menu_args));
  106.     popdown_actions = XtParseTranslationTable(
  107.         "<Btn3Up>:MenuPopdown()\n\
  108.         <LeaveWindow>:MenuPopdown()\n");
  109.     XtOverrideTranslations(menu, popdown_actions);
  110.     panes = XtCreateManagedWidget("menu", boxWidgetClass, menu, menu_args,
  111.         XtNumber(menu_args));
  112.     pane_actions = XtParseTranslationTable(
  113.         "<EnterWindow>:set()\n\
  114.         <Btn3Up>:notify()unset()\n");
  115.     for (i = 0; i < XtNumber(pumenu_items); i++)
  116.     {
  117.         mi = &pumenu_items[i];
  118.         tlen = strlen(mi->label);
  119.         if( tlen > rlen )
  120.             rlen = tlen;
  121.     }
  122.     
  123.     pane_args[3].value = char_width(canvas_font) * rlen + 10;
  124.  
  125.     pane_args[2].value = (XtArgVal)"COMMANDS";
  126.     pane = XtCreateManagedWidget("title", labelWidgetClass,
  127.                    panes, pane_args, 4);
  128.     for (i = 0; i < XtNumber(pumenu_items); ++i)
  129.     {
  130.         mi = &pumenu_items[i];
  131.         pane_args[2].value = (XtArgVal)mi->label;
  132.         pane_callbacks[0].closure = (caddr_t)mi;
  133.         pane = XtCreateManagedWidget("pane", commandWidgetClass,
  134.             panes, pane_args, XtNumber(pane_args));
  135.         XtOverrideTranslations(pane, pane_actions);
  136.     }
  137.     return (1);
  138. }
  139.  
  140. set_popupmenu(event)
  141.     INPUTEVENT    *event;
  142. {
  143. }
  144.  
  145. void pane_select(widget, mi)
  146.     TOOL            widget;
  147.     MENUITEM        *mi;
  148. {
  149.     int            menu_code = (int)mi->info;
  150. #else
  151. #ifdef AMIGA
  152. extern struct Window * figwin;
  153. extern struct Requester * menureq;
  154.  
  155. set_popupmenu()
  156. {
  157.     Request(menureq,figwin);
  158. }
  159.  
  160. menufunc(event,Gadget)
  161. struct IntuiMessage * event;
  162. struct Gadget * Gadget;
  163. {
  164.     long menu_code;
  165.     char * name;
  166.     int i;
  167.  
  168.     name=Gadget->GadgetText->IText;
  169.     for (i=0;i<NUMMENUITEMS;i++)
  170.         if (!strcmp(pumenu_items[i].ptr,name)) break;
  171. /*    if (i==NUMMENUITEMS) {fprintf(stderr,"!!! Illegal Gadget.\n");return 1;}*/
  172.     else
  173.     menu_code=pumenu_items[i].code;
  174. #else
  175. set_popupmenu(ie)
  176. INPUTEVENT      *ie;
  177. {
  178.     MENUITEM        *mi;
  179.     char             menu_code;
  180.     int             x, y;
  181.  
  182.     x = ie->ie_locx; y = ie->ie_locy;
  183.         if ((mi = menu_display(&menu_ptr, ie, canvas_swfd)) == NULL) return;
  184.     win_setmouseposition(canvas_swfd, x, y);    
  185.         menu_code = (short) mi->mi_data;
  186. #endif AMIGA
  187. #endif    X11
  188.     switch(menu_code) {
  189.         case F_UNDO : 
  190.         undo();
  191.         break;
  192.         case F_READ :
  193.         init_msg_receiving(read_file, "Read file : ");
  194.         break;
  195.         case F_SAVE :
  196.         (void)save_current_file();
  197.         break;
  198.         case F_SAVE_IN : 
  199.         if (no_object()) {
  200.             put_msg("No figure to save; ignored");
  201.             break;
  202.             }
  203.         init_msg_receiving(save_file, "Save in file : ");
  204.         break;
  205.         case F_REDISPLAY :
  206.         redisplay_canvas();
  207.         break;
  208.         case F_EDIT :
  209.         if (!no_object() && figure_modified) {
  210.             if (wmgr_confirm(canvas_swfd, edit_msg) != -1) break;
  211.             }
  212.         init_msg_receiving(edit_file, "Edit file : ");
  213.         break;
  214.         case F_REMOVE_ALL :
  215.         remove_all();
  216.         put_msg("Immediate Undo will restore the figure.");
  217.         redisplay_canvas();
  218.         break;
  219.         case F_CHDIR :
  220.         init_msg_receiving(change_directory, "Directory : ");
  221.         break;
  222.         case F_STATUS :
  223.         status();
  224.         break;
  225.         case F_SAVE_N_EXIT :
  226.         if (! figure_modified) quit();
  227.         if (no_object()) quit();
  228.         if (*current_file != 0) {
  229.             if (0 == write_file(current_file, 0)) quit();
  230.             }
  231.         else {
  232.             blink_msg();
  233.             init_msg_receiving(save_and_exit, "Save in file : ");
  234.             }
  235.         break;
  236.         case F_QUIT : 
  237.         quit();
  238.         break;
  239.         case F_SAVE_BITMAP : 
  240.         if (no_object()) {
  241.             put_msg("No figure to save");
  242.             break;
  243.             }
  244.         init_msg_receiving(write_bitmap, "Save bitmap to file : ");
  245.         break;
  246.         }
  247. #ifdef    X11
  248.     XtPopdown(menu);
  249. #endif    X11
  250.     }
  251.  
  252. quit()
  253. {
  254.     if (no_object()) {
  255.         tool_destroy(tool);
  256.         _abort(0);
  257.         }
  258.     if (! figure_modified) {
  259.         tool_destroy(tool);
  260.         _abort(0);
  261.         }
  262. #ifdef AMIGA
  263.     if(TwoGadRequest("Please confirm that you wish to quit `FIG'"))
  264.     {
  265.         tool_destroy(tool);
  266.         _abort(0);
  267.     }
  268. #else
  269.     if (wmgr_confirm(canvas_swfd, quit_msg) == -1) {
  270.         tool_destroy(tool);
  271.         _abort(0);
  272.         }
  273. #endif
  274.     }
  275.